/**
 * Copyright 2020 Webank.
 *
 * <p>Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
 * except in compliance with the License. You may obtain a copy of the License at
 *
 * <p>http://www.apache.org/licenses/LICENSE-2.0
 *
 * <p>Unless required by applicable law or agreed to in writing, software distributed under the
 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.webank.blockchain.gov.acct.contract;

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.fisco.bcos.sdk.abi.FunctionEncoder;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.datatypes.Address;
import org.fisco.bcos.sdk.abi.datatypes.Bool;
import org.fisco.bcos.sdk.abi.datatypes.DynamicArray;
import org.fisco.bcos.sdk.abi.datatypes.Event;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.generated.Bytes32;
import org.fisco.bcos.sdk.abi.datatypes.generated.Uint16;
import org.fisco.bcos.sdk.abi.datatypes.generated.Uint256;
import org.fisco.bcos.sdk.abi.datatypes.generated.Uint8;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple2;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple3;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple4;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple5;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple8;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.eventsub.EventCallback;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;

@SuppressWarnings("unchecked")
public class UserAccount extends Contract {
    public static final String[] BINARY_ARRAY = {
        "60806040526000600c60146101000a81548160ff021916908360ff1602179055503480156200002d57600080fd5b50604051604080620041a8833981018060405281019080805190602001909291908051906020019092919050505081336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271060056004018190555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506000600c60156101000a81548160ff021916908360ff160217905550620001208162000128640100000000026401000000009004565b5050620002b0565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000213576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc66d1d23a5b7baf1f496bb19f580d7b12070ad5a08a758c990db97d961fa33a660405160405180910390a350565b613ee880620002c06000396000f300608060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630a0155e5146101385780630b8160451461017d5780630fb3844c1461026b57806313af40351461029c5780631400a813146102df5780631709ef07146103485780632b3c0a40146103de57806344b63d051461043957806362a5af3b14610468578063669271de146104975780636a28f000146105345780638866eaec14610563578063a02b161e14610592578063a683e853146105d7578063a730117e14610677578063adc1fb77146106d6578063b2623cb014610792578063b2bdfa7b146107e9578063b890392314610840578063c3d4cb0b14610871578063c9d27afe14610934578063ea8a1af014610985578063f5ee9c7a146109b4575b600080fd5b34801561014457600080fd5b5061016360048036038101908080359060200190929190505050610a83565b604051808215151515815260200191505060405180910390f35b34801561018957600080fd5b506101a860048036038101908080359060200190929190505050610aa0565b604051808981526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018761ffff1661ffff1681526020018661ffff1661ffff1681526020018560ff1660ff1681526020018460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff1681526020019850505050505050505060405180910390f35b34801561027757600080fd5b50610280610adb565b604051808260ff1660ff16815260200191505060405180910390f35b3480156102a857600080fd5b506102dd600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610aee565b005b3480156102eb57600080fd5b5061032e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050610c75565b604051808215151515815260200191505060405180910390f35b34801561035457600080fd5b506103c4600480360381019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050610f65565b604051808215151515815260200191505060405180910390f35b3480156103ea57600080fd5b5061041f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610fb4565b604051808215151515815260200191505060405180910390f35b34801561044557600080fd5b5061044e6110ea565b604051808215151515815260200191505060405180910390f35b34801561047457600080fd5b5061047d6111f9565b604051808215151515815260200191505060405180910390f35b3480156104a357600080fd5b50610513600480360381019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff16906020019092919050505061142f565b60405180831515151581526020018281526020019250505060405180910390f35b34801561054057600080fd5b50610549611747565b604051808215151515815260200191505060405180910390f35b34801561056f57600080fd5b5061057861198b565b604051808215151515815260200191505060405180910390f35b34801561059e57600080fd5b506105bd600480360381019080803590602001909291905050506119a7565b604051808215151515815260200191505060405180910390f35b3480156105e357600080fd5b5061065d60048036038101908080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050611b44565b604051808215151515815260200191505060405180910390f35b34801561068357600080fd5b506106b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e5a565b604051808261ffff1661ffff16815260200191505060405180910390f35b3480156106e257600080fd5b5061070160048036038101908080359060200190929190505050611e77565b604051808560ff1660ff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff16815260200194505050505060405180910390f35b34801561079e57600080fd5b506107a7611ea0565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107f557600080fd5b506107fe611ec6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561084c57600080fd5b50610855611eeb565b604051808260ff1660ff16815260200191505060405180910390f35b34801561087d57600080fd5b50610886611efe565b6040518080602001806020018461ffff1661ffff168152602001838103835286818151815260200191508051906020019060200280838360005b838110156108db5780820151818401526020810190506108c0565b50505050905001838103825285818151815260200191508051906020019060200280838360005b8381101561091d578082015181840152602081019050610902565b505050509050019550505050505060405180910390f35b34801561094057600080fd5b5061096b60048036038101908080359060200190929190803515159060200190929190505050611f18565b604051808215151515815260200191505060405180910390f35b34801561099157600080fd5b5061099a6121a3565b604051808215151515815260200191505060405180910390f35b3480156109c057600080fd5b50610a696004803603810190808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803561ffff169060200190929190505050612368565b604051808215151515815260200191505060405180910390f35b6000610a9982600561249f90919063ffffffff16565b9050919050565b600080600080600080600080610ac08960056124d290919063ffffffff16565b97509750975097509750975097509750919395975091939597565b600c60149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610bd8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc66d1d23a5b7baf1f496bb19f580d7b12070ad5a08a758c990db97d961fa33a660405160405180910390a350565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610d62576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000",
        "000000000000000000000000000000000081525060400191505060405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015610e1f57600080fd5b505af1158015610e33573d6000803e3d6000fd5b505050506040513d6020811015610e4957600080fd5b810190808051906020019092919050505090506000600c60159054906101000a900460ff1660ff1614158015610eac5750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1515610f46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f5745476f7665726e616e63653a2077656967687420616464726573732073686f81526020017f756c6420626520657869737465642e000000000000000000000000000000000081525060400191505060405180910390fd5b610f5c818460016127a79092919063ffffffff16565b91505092915050565b600080600c60159054906101000a900460ff1660ff161415610f8a5760019050610fac565b610fa98560ff168686868660056129519095949392919063ffffffff16565b90505b949350505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60156101000a81548160ff021916908360ff1602179055506001905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156112e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6112ee61198b565b1515611388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f206973206e6f726d616c2e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60146101000a81548160ff021916908360ff1602179055507f667265657a6500000000000000000000000000000000000000000000000000007f7d78a1adf6a29dad801d43ddd0c4478ec0cbf1bd9bfdd2e007d90429959f363e30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561151c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b611673600160606040519081016040529081600182018054806020026020016040519081016040528092919081815260200182805480156115b257602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611568575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561163257602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116115f95790505b505050505081526020016003820160009054906101000a900461ffff1661ffff1661ffff1681525050878787876005612b019095949392919063ffffffff16565b80925081935050508473ffffffffffffffffffffffffffffffffffffffff168660ff16827f6bc2a40e2ac753b31d589730c2651eeb053a0abb859435dadcbb916fa464227a878730604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018361ffff1661ffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a494509492505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611834576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60149054906101000a900460ff1660ff161415156118e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f2069732061626e6f726d616c2e0000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60146101000a81548160ff021916908360ff1602179055507f756e667265657a650000000000000000000000000000000000000000000000007f7d78a1adf6a29dad801d43ddd0c4478ec0cbf1bd9bfdd2e007d90429959f363e30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b600080600c60149054906101000a900460ff1660ff1614905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611a515750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611ac5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4f6e6c79206163636f756e74206d616e616765722e000000000000000000000081525060200191505060405180910390fd5b611ad9826005612b3a90919063ffffffff16565b9050817ff749e1738bb417e5c8584a97954122c20a7d6b24c00ee4282bacae10ad9b590c30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c30576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b611d8960016060604051908101604052908160018201805480602002602001604051908101604052809291908181526020018280548015611cc657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611c7c575b5050505050815260200160028201805480602002602001604051908101604052809291908181526020018280548015611d4657602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411",
        "611d0d5790505b505050505081526020016003820160009054906101000a900461ffff1661ffff1661ffff168152505087878787876005612d4d909695949392919063ffffffff16565b50809150508373ffffffffffffffffffffffffffffffffffffffff168560ff16877f6bc2a40e2ac753b31d589730c2651eeb053a0abb859435dadcbb916fa464227a868630604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018361ffff1661ffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a495945050505050565b6000611e7082600161308490919063ffffffff16565b9050919050565b600080600080611e9185600561311290919063ffffffff16565b93509350935093509193509193565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600c60159054906101000a900460ff1681565b6060806000611f0d600161324d565b925092509250909192565b6000612025600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b158015611fda57600080fd5b505af1158015611fee573d6000803e3d6000fd5b505050506040513d602081101561200457600080fd5b8101908080519060200190929190505050600161337c90919063ffffffff16565b1515612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f566f74652073686f756c6420626520696e20746865206c69737400000000000081525060200191505060405180910390fd5b61219b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fb47e016336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561215957600080fd5b505af115801561216d573d6000803e3d6000fd5b505050506040513d602081101561218357600080fd5b81019080805190602001909291905050508484613427565b905092915050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061224d57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156122c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f426173654163636f756e743a206f6e6c7920617574686f72697a65642e00000081525060200191505060405180910390fd5b6002600c60146101000a81548160ff021916908360ff1602179055507f63616e63656c00000000000000000000000000000000000000000000000000007f7d78a1adf6a29dad801d43ddd0c4478ec0cbf1bd9bfdd2e007d90429959f363e30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612454576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60156101000a81548160ff021916908360ff16021790555061247a60016134e0565b5061249384848460016135c3909392919063ffffffff16565b50600190509392505050565b6000600183600501600084815260200190815260200160002060009054906101000a900460ff1660ff1614905092915050565b6000806000806000806000806124e6613c22565b8a8a600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156125eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8c60060160008d81526020019081526020016000206101006040519081016040529081600082015481526020016001820160009054906101000a900461ffff1661ffff1661ffff1681526020016001820160029054906101000a900461ffff1661ffff1661ffff1681526020016001820160049054906101000a900460ff1660ff1660ff1681526020016001820160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160199054906101000a900460ff1660ff1660ff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160149054906101000a900461ffff1661ffff1661ffff16815250509250826000015183608001518460200151856040015186606001518760a001518860c001518960e001519a509a509a509a509a509a509a509a505050509295985092959890939650565b6000808460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081141561290057846001018490806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508460020183908060018154018082558091505090600182039060005260206000209060109182820401919006600202909192909190916101000a81548161ffff021916908361ffff1602179055505084600101805490508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612945565b82856002016001830381548110151561291557fe5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505b60019150509392505050565b600061295d878761249f565b15612af2578373ffffffffffffffffffffffffffffffffffffffff1687600601600088815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161480156129ff57508460ff1687600601600088815260200190815260200160002060010160049054906101000a900460ff1660ff16145b8015612a6e57508273ffffffffffffffffffffffffffffffffffffffff1687600601600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b8015612aa757508161ffff1687600601600088815260200190815260200160002060020160149054906101000a900461ffff1661ffff16145b8015612adb5750600187600601600088815260200190815260200160002060010160199054906101000a900460ff1660ff16145b15612ae95760019050612af7565b60009050612af7565b600090505b9695505050505050565b6000808760040160008154809291906001019190505550612b2b88888a6004015489898989612d4d565b91509150965096945050505050565b60008282600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612c41576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600085600501600086815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508460060160008581526020019081526020016000206000808201600090556001820160006101000a81549061ffff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549060ff02191690556001820160056101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160196101000a81549060ff02191690556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160146101000a81549061ffff02",
        "191690555050505092915050565b6000806000612d5a613c22565b8a89600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515612e5e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4c6962426f617264566f74653a20766f7465206964206e6f742065786973746581526020017f642e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8b604001519350610100604051908101604052808c81526020018561ffff168152602001600061ffff1681526020018b60ff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001600060ff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018861ffff168152509250828d60060160008d81526020019081526020016000206000820151816000015560208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555060608201518160010160046101000a81548160ff021916908360ff16021790555060808201518160010160056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160010160196101000a81548160ff021916908360ff16021790555060c08201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160020160146101000a81548161ffff021916908361ffff16021790555090505060018d60050160008d815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060018b955095505050505097509795505050505050565b60008060008460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054915084600201600183038154811015156130e157fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050809250505092915050565b6000806000808585600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561321d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61323a886006016000898152602001908152602001600020613744565b9550955095509550505092959194509250565b606080600083600101846002018560030160009054906101000a900461ffff16828054806020026020016040519081016040528092919081815260200182805480156132ee57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116132a4575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561336857602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161332f5790505b505050505091509250925092509193909250565b6000808360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081148061340d5750600084600201600183038154811015156133e357fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff16145b1561341b5760009150613420565b600191505b5092915050565b60008060009050613449600186868660056137c890949392919063ffffffff16565b80925081935050508473ffffffffffffffffffffffffffffffffffffffff16847f04a4fe0bd778eb9d1e84c14e70e87a6fa39d0121e01a1ca803cd3aaf42c6b13c853060405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a3509392505050565b600080600090505b826001018054905081101561358457826000016000846001018381548110151561350e57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000905580806001019150506134e8565b8260010160006135949190613ca6565b8260020160006135a49190613cc7565b8260030160006101000a81549061ffff02191690556001915050919050565b600080856135d081613994565b151561366a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f4c6962426f617264566f74653a20766f746520776569676874206973206e6f7481526020017f20656d7074792e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b85876001019080519060200190613682929190613cef565b508487600201908051906020019061369b929190613d79565b50838760030160006101000a81548161ffff021916908361ffff160217905550600091505b8551821015613736576001820187600001600088858151811015156136e157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081806001019250506136c0565b600192505050949350505050565b6000806000808460010160049054906101000a900460ff168560010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168760020160149054906101000a900461ffff1693509350935093509193509193565b6000806000808886600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156138d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6138dd8a8a613084565b935060008461ffff1611151561395b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f766f7465206572726f722c206e6f7420612076616c696420766f7465722e000081525060200191505060405180910390fd5b8a6006016000898152602001908152602001600020925061397e838a868a6139ca565b8096508197505050505050509550959350505050565b600080826001018054905011806139b2575060008260020180549050115b156139c057600090506139c5565b600190505b919050565b6000808560030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613a7957508215158660040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b15613a9c5760008660010160029054906101000a900461ffff1691509150613c19565b8215613ad557838660010160028282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b60018660030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550828660040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560010160009054906101000a900461ffff1661ffff168660010160029054906101000a900461ffff1661ffff16101515613be05760018660010160196101000a81548160ff021916908360ff160217905550613bff565b60008660010160196101000a81548160ff021916908360ff1602179055505b60018660010160029054906101000a900461ffff16915091505b94509492505050565b6101006040519081016040528060008152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600061ffff1681525090565b5080546000825590600052602060002090810190613cc49190613e23565b50565b50805460008255600f016010900490600052602060002090810190613cec9190613e23565b50565b828054828255906000526020600020908101928215613d68579160200282015b82811115613d675782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ff",
        "ffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613d0f565b5b509050613d759190613e48565b5090565b82805482825590600052602060002090600f01601090048101928215613e125791602002820160005b83821115613de257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613da2565b8015613e105782816101000a81549061ffff0219169055600201602081600101049283019260010302613de2565b505b509050613e1f9190613e8b565b5090565b613e4591905b80821115613e41576000816000905550600101613e29565b5090565b90565b613e8891905b80821115613e8457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101613e4e565b5090565b90565b613eb991905b80821115613eb557600081816101000a81549061ffff021916905550600101613e91565b5090565b905600a165627a7a72305820e10920cc71fe2b42c2838641af53a024cb72889078b4aee325e0b97690ecd6a00029"
    };

    public static final String BINARY = String.join("", BINARY_ARRAY);

    public static final String[] SM_BINARY_ARRAY = {
        "60806040526000600c60146101000a81548160ff021916908360ff1602179055503480156200002d57600080fd5b50604051604080620041a8833981018060405281019080805190602001909291908051906020019092919050505081336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061271060056004018190555080600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506000600c60156101000a81548160ff021916908360ff160217905550620001208162000128640100000000026401000000009004565b5050620002b0565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000213576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f480107a875206c9f5ec6e8b65d989106e27d0fc8b130625b25997540ddfc334a60405160405180910390a350565b613ee880620002c06000396000f300608060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305282c701461013857806308165cd61461017b5780630d32aad3146101aa5780631ad69a6e1461024057806320e462b01461028557806328e91489146102ca57806335968e6814610321578063398fc78114610350578063582bc239146103a757806366a24696146103f85780636f53a472146104b45780637c1a8d95146105515780638b0114981461063f5780638f55e2251461069a578063a0cdc682146106c9578063a2495d4614610798578063aef5ecfa146107c7578063d1dcf9ae14610826578063df3150aa14610857578063ede7ddf614610886578063ef79841d146108b7578063fb029fda1461097a578063fdc10eed14610a1a575b600080fd5b34801561014457600080fd5b50610179600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a83565b005b34801561018757600080fd5b50610190610c0a565b604051808215151515815260200191505060405180910390f35b3480156101b657600080fd5b50610226600480360381019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050610e4e565b604051808215151515815260200191505060405180910390f35b34801561024c57600080fd5b5061026b60048036038101908080359060200190929190505050610e9d565b604051808215151515815260200191505060405180910390f35b34801561029157600080fd5b506102b06004803603810190808035906020019092919050505061103a565b604051808215151515815260200191505060405180910390f35b3480156102d657600080fd5b506102df611057565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561032d57600080fd5b5061033661107c565b604051808215151515815260200191505060405180910390f35b34801561035c57600080fd5b50610365611098565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103b357600080fd5b506103de600480360381019080803590602001909291908035151590602001909291905050506110be565b604051808215151515815260200191505060405180910390f35b34801561040457600080fd5b5061042360048036038101908080359060200190929190505050611349565b604051808560ff1660ff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff16815260200194505050505060405180910390f35b3480156104c057600080fd5b50610530600480360381019080803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050611372565b60405180831515151581526020018281526020019250505060405180910390f35b34801561055d57600080fd5b5061057c6004803603810190808035906020019092919050505061168a565b604051808981526020018873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018761ffff1661ffff1681526020018661ffff1661ffff1681526020018560ff1660ff1681526020018460ff1660ff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018261ffff1661ffff1681526020019850505050505050505060405180910390f35b34801561064b57600080fd5b50610680600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116c5565b604051808215151515815260200191505060405180910390f35b3480156106a657600080fd5b506106af6117fb565b604051808215151515815260200191505060405180910390f35b3480156106d557600080fd5b5061077e6004803603810190808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803561ffff169060200190929190505050611a31565b604051808215151515815260200191505060405180910390f35b3480156107a457600080fd5b506107ad611b68565b604051808215151515815260200191505060405180910390f35b3480156107d357600080fd5b50610808600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c77565b604051808261ffff1661ffff16815260200191505060405180910390f35b34801561083257600080fd5b5061083b611c94565b604051808260ff1660ff16815260200191505060405180910390f35b34801561086357600080fd5b5061086c611ca7565b604051808215151515815260200191505060405180910390f35b34801561089257600080fd5b5061089b611e6c565b604051808260ff1660ff16815260200191505060405180910390f35b3480156108c357600080fd5b506108cc611e7f565b6040518080602001806020018461ffff1661ffff168152602001838103835286818151815260200191508051906020019060200280838360005b83811015610921578082015181840152602081019050610906565b50505050905001838103825285818151815260200191508051906020019060200280838360005b83811015610963578082015181840152602081019050610948565b505050509050019550505050505060405180910390f35b34801561098657600080fd5b50610a0060048036038101908080359060200190929190803560ff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff169060200190929190505050611e99565b604051808215151515815260200191505060405180910390f35b348015610a2657600080fd5b50610a69600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803561ffff1690602001909291905050506121af565b604051808215151515815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610b6d576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f480107a875206c9f5ec6e8b65d989106e27d0fc8b130625b25997540ddfc334a60405160405180910390a350565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610cf7576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60149054906101000a900460ff1660ff16141515610da7576040517fc703cb12000000000000000000000000000000000000000000000000000000008152600401808060",
        "20018281038252602d8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f2069732061626e6f726d616c2e0000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60146101000a81548160ff021916908360ff1602179055507f756e667265657a650000000000000000000000000000000000000000000000007f598b76607bab91793e04db590052049ff4ca46cfc234328da5536f5169790af730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b600080600c60159054906101000a900460ff1660ff161415610e735760019050610e95565b610e928560ff1686868686600561249f9095949392919063ffffffff16565b90505b949350505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f475750600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610fbb576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4f6e6c79206163636f756e74206d616e616765722e000000000000000000000081525060200191505060405180910390fd5b610fcf82600561264f90919063ffffffff16565b9050817f5266434aba1b39373168719f7f2d659dffcb1169882fc929c56fa6e8589fe9a230604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a2919050565b600061105082600561286290919063ffffffff16565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600c60149054906101000a900460ff1660ff1614905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006111cb600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561118057600080fd5b505af1158015611194573d6000803e3d6000fd5b505050506040513d60208110156111aa57600080fd5b8101908080519060200190929190505050600161289590919063ffffffff16565b151561123f576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f566f74652073686f756c6420626520696e20746865206c69737400000000000081525060200191505060405180910390fd5b611341600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156112ff57600080fd5b505af1158015611313573d6000803e3d6000fd5b505050506040513d602081101561132957600080fd5b81019080805190602001909291905050508484612940565b905092915050565b6000806000806113638560056129f990919063ffffffff16565b93509350935093509193509193565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561145f576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6115b6600160606040519081016040529081600182018054806020026020016040519081016040528092919081815260200182805480156114f557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190600101908083116114ab575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561157557602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161153c5790505b505050505081526020016003820160009054906101000a900461ffff1661ffff1661ffff1681525050878787876005612b349095949392919063ffffffff16565b80925081935050508473ffffffffffffffffffffffffffffffffffffffff168660ff16827f095e656aa11fe030d6cf71f4a33de53c10d94b4b3002eefbb7f905e143fcb0b5878730604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018361ffff1661ffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a494509492505050565b6000806000806000806000806116aa896005612b6d90919063ffffffff16565b97509750975097509750975097509750919395975091939597565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156117b2576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156118e8576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6118f061107c565b151561198a576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f206973206e6f726d616c2e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60146101000a81548160ff021916908360ff1602179055507f667265657a6500000000000000000000000000000000000000000000000000007f598b76607bab91793e04db590052049ff4ca46cfc234328da5536f5169790af730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b1d576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600c60156101000a81548160ff021916908360ff160217905550611b436001612e42565b50611b5c8484846001612f25909392919063ffffffff16565b50600190509392505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611c54576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600c60156101000a81548160ff021916908360ff1602179055506001905090565b6000611c8d8260016130a690919063ffffffff16565b9050919050565b600c60159054906101000a900460ff1681565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611d5157506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffff",
        "ffffffffffffffffffffffffffffff16145b1515611dc5576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f426173654163636f756e743a206f6e6c7920617574686f72697a65642e00000081525060200191505060405180910390fd5b6002600c60146101000a81548160ff021916908360ff1602179055507f63616e63656c00000000000000000000000000000000000000000000000000007f598b76607bab91793e04db590052049ff4ca46cfc234328da5536f5169790af730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b600c60149054906101000a900460ff1681565b6060806000611e8e6001613134565b925092509250909192565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611f85576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6120de6001606060405190810160405290816001820180548060200260200160405190810160405280929190818152602001828054801561201b57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611fd1575b505050505081526020016002820180548060200260200160405190810160405280929190818152602001828054801561209b57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116120625790505b505050505081526020016003820160009054906101000a900461ffff1661ffff1661ffff168152505087878787876005613263909695949392919063ffffffff16565b50809150508373ffffffffffffffffffffffffffffffffffffffff168560ff16877f095e656aa11fe030d6cf71f4a33de53c10d94b4b3002eefbb7f905e143fcb0b5868630604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018361ffff1661ffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001935050505060405180910390a495945050505050565b6000806000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561229c576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f57454261736963417574683a206f6e6c79206f776e657220697320617574686f81526020017f72697a65642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a5d51f74856040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561235957600080fd5b505af115801561236d573d6000803e3d6000fd5b505050506040513d602081101561238357600080fd5b810190808051906020019092919050505090506000600c60159054906101000a900460ff1660ff16141580156123e65750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1515612480576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001807f5745476f7665726e616e63653a2077656967687420616464726573732073686f81526020017f756c6420626520657869737465642e000000000000000000000000000000000081525060400191505060405180910390fd5b6124968184600161359a9092919063ffffffff16565b91505092915050565b60006124ab8787612862565b15612640578373ffffffffffffffffffffffffffffffffffffffff1687600601600088815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614801561254d57508460ff1687600601600088815260200190815260200160002060010160049054906101000a900460ff1660ff16145b80156125bc57508273ffffffffffffffffffffffffffffffffffffffff1687600601600088815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b80156125f557508161ffff1687600601600088815260200190815260200160002060020160149054906101000a900461ffff1661ffff16145b80156126295750600187600601600088815260200190815260200160002060010160199054906101000a900460ff1660ff16145b156126375760019050612645565b60009050612645565b600090505b9695505050505050565b60008282600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612756576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600085600501600086815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508460060160008581526020019081526020016000206000808201600090556001820160006101000a81549061ffff02191690556001820160026101000a81549061ffff02191690556001820160046101000a81549060ff02191690556001820160056101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001820160196101000a81549060ff02191690556002820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556002820160146101000a81549061ffff02191690555050505092915050565b6000600183600501600084815260200190815260200160002060009054906101000a900460ff1660ff1614905092915050565b6000808360000160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114806129265750600084600201600183038154811015156128fc57fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff1661ffff16145b156129345760009150612939565b600191505b5092915050565b600080600090506129626001868686600561374490949392919063ffffffff16565b80925081935050508473ffffffffffffffffffffffffffffffffffffffff16847f840e27e8c58f2eb0ad79d711f0779c5edc7765309b5a0c4f4869c9039759266a853060405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a3509392505050565b6000806000808585600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612b04576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b612b21886006016000898152602001908152602001600020613910565b9550955095509550505092959194509250565b6000808760040160008154809291906001019190505550612b5e88888a6004015489898989613263565b91509150965096945050505050565b600080600080600080600080612b81613c22565b8a8a600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515612c86576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8c60060160008d81526020019081526020016000206101006040519081016040529081600082015481526020016001820160009054906101000a900461ffff1661ffff1661ffff1681526020016001820160029054906101000a900461ffff1661ffff1661ffff1681526020016001820160049054906101000a900460ff1660ff1660ff1681526020016001820160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffff",
        "ffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160199054906101000a900460ff1660ff1660ff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160149054906101000a900461ffff1661ffff1661ffff16815250509250826000015183608001518460200151856040015186606001518760a001518860c001518960e001519a509a509a509a509a509a509a509a505050509295985092959890939650565b600080600090505b8260010180549050811015612ee6578260000160008460010183815481101515612e7057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600090558080600101915050612e4a565b826001016000612ef69190613ca6565b826002016000612f069190613cc7565b8260030160006101000a81549061ffff02191690556001915050919050565b60008085612f3281613994565b1515612fcc576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f4c6962426f617264566f74653a20766f746520776569676874206973206e6f7481526020017f20656d7074792e0000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b85876001019080519060200190612fe4929190613cef565b5084876002019080519060200190612ffd929190613d79565b50838760030160006101000a81548161ffff021916908361ffff160217905550600091505b85518210156130985760018201876000016000888581518110151561304357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508180600101925050613022565b600192505050949350505050565b60008060008460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549150846002016001830381548110151561310357fe5b90600052602060002090601091828204019190066002029054906101000a900461ffff169050809250505092915050565b606080600083600101846002018560030160009054906101000a900461ffff16828054806020026020016040519081016040528092919081815260200182805480156131d557602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161318b575b505050505092508180548060200260200160405190810160405280929190818152602001828054801561324f57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116132165790505b505050505091509250925092509193909250565b6000806000613270613c22565b8a89600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515613374576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f4c6962426f617264566f74653a20766f7465206964206e6f742065786973746581526020017f642e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8b604001519350610100604051908101604052808c81526020018561ffff168152602001600061ffff1681526020018b60ff1681526020018a73ffffffffffffffffffffffffffffffffffffffff168152602001600060ff1681526020018973ffffffffffffffffffffffffffffffffffffffff1681526020018861ffff168152509250828d60060160008d81526020019081526020016000206000820151816000015560208201518160010160006101000a81548161ffff021916908361ffff16021790555060408201518160010160026101000a81548161ffff021916908361ffff16021790555060608201518160010160046101000a81548160ff021916908360ff16021790555060808201518160010160056101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060a08201518160010160196101000a81548160ff021916908360ff16021790555060c08201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060e08201518160020160146101000a81548161ffff021916908361ffff16021790555090505060018d60050160008d815260200190815260200160002060006101000a81548160ff021916908360ff16021790555060018b955095505050505097509795505050505050565b6000808460000160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114156136f357846001018490806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508460020183908060018154018082558091505090600182039060005260206000209060109182820401919006600202909192909190916101000a81548161ffff021916908361ffff1602179055505084600101805490508560000160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613738565b82856002016001830381548110151561370857fe5b90600052602060002090601091828204019190066002026101000a81548161ffff021916908361ffff1602179055505b60019150509392505050565b6000806000808886600073ffffffffffffffffffffffffffffffffffffffff1682600601600083815260200190815260200160002060010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151561384f576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001807f4c6962426f617264566f74653a20766f746520696420616c726561647920657881526020017f69737465642e000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6138598a8a6130a6565b935060008461ffff161115156138d7576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f766f7465206572726f722c206e6f7420612076616c696420766f7465722e000081525060200191505060405180910390fd5b8a600601600089815260200190815260200160002092506138fa838a868a6139ca565b8096508197505050505050509550959350505050565b6000806000808460010160049054906101000a900460ff168560010160059054906101000a900473ffffffffffffffffffffffffffffffffffffffff168660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168760020160149054906101000a900461ffff1693509350935093509193509193565b600080826001018054905011806139b2575060008260020180549050115b156139c057600090506139c5565b600190505b919050565b6000808560030160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168015613a7957508215158660040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515145b15613a9c5760008660010160029054906101000a900461ffff1691509150613c19565b8215613ad557838660010160028282829054906101000a900461ffff160192506101000a81548161ffff021916908361ffff1602179055505b60018660030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550828660040160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508560010160009054906101000a900461ffff1661ffff168660010160029054906101000a900461ffff1661ffff16101515613be05760018660010160196101000a81548160ff021916908360ff160217905550613bff565b60008660010160196101000a81548160ff021916908360ff1602179055505b60018660010160029054906101000a900461ffff16915091505b94509492505050565b6101006040519081016040528060008152602001600061ffff168152602001600061ffff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600060ff168152602001600073ffffffffffffffffffffffffffffffffffffffff168152602001600061ffff1681525090565b5080546000825590600052602060002090810190613cc49190613e23565b50565b50805460008255600f016010900490600052602060002090810190613cec9190613e23565b50565b828054828255906000526020600020908101928215613d68579160200282015b82811115613d675782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ff",
        "ffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190613d0f565b5b509050613d759190613e48565b5090565b82805482825590600052602060002090600f01601090048101928215613e125791602002820160005b83821115613de257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613da2565b8015613e105782816101000a81549061ffff0219169055600201602081600101049283019260010302613de2565b505b509050613e1f9190613e8b565b5090565b613e4591905b80821115613e41576000816000905550600101613e29565b5090565b90565b613e8891905b80821115613e8457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101613e4e565b5090565b90565b613eb991905b80821115613eb557600081816101000a81549061ffff021916905550600101613e91565b5090565b905600a165627a7a723058200351535d685d6235d62dc0aa5f858180aca5a88b214e64fcf1e4c5b66495495b0029"
    };

    public static final String SM_BINARY = String.join("", SM_BINARY_ARRAY);

    public static final String[] ABI_ARRAY = {
        "[{\"constant\":true,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"passed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getRequestInfo\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint16\"},{\"name\":\"\",\"type\":\"uint16\"},{\"name\":\"\",\"type\":\"uint8\"},{\"name\":\"\",\"type\":\"uint8\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_status\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"},{\"name\":\"weight\",\"type\":\"uint16\"}],\"name\":\"setWeight\",\"outputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"txType\",\"type\":\"uint8\"},{\"name\":\"requestAddress\",\"type\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\"},{\"name\":\"newValue\",\"type\":\"uint16\"}],\"name\":\"passed\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setOwnerByManager\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"setStatics\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"freeze\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"txType\",\"type\":\"uint8\"},{\"name\":\"requestAddress\",\"type\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\"},{\"name\":\"newValue\",\"type\":\"uint16\"}],\"name\":\"register\",\"outputs\":[{\"name\":\"b\",\"type\":\"bool\"},{\"name\":\"id\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"unfreeze\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"isNormal\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"unregister\",\"outputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"},{\"name\":\"txType\",\"type\":\"uint8\"},{\"name\":\"requestAddress\",\"type\":\"address\"},{\"name\":\"newAddress\",\"type\":\"address\"},{\"name\":\"newValue\",\"type\":\"uint16\"}],\"name\":\"register\",\"outputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"getVoteWeight\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"getVoteParas\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"address\"},{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_accountManager\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_statics\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getWeightInfo\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"},{\"name\":\"\",\"type\":\"uint16[]\"},{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"id\",\"type\":\"uint256\"},{\"name\":\"flag\",\"type\":\"bool\"}],\"name\":\"vote\",\"outputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"cancel\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"key\",\"type\":\"address[]\"},{\"name\":\"value\",\"type\":\"uint16[]\"},{\"name\":\"threshold\",\"type\":\"uint16\"}],\"name\":\"setVoteStatics\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"accountManager\",\"type\":\"address\"},{\"name\":\"owner\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"txType\",\"type\":\"uint8\"},{\"indexed\":true,\"name\":\"requestAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"newAddress\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"newValue\",\"type\":\"uint16\"},{\"indexed\":false,\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"LogRegister\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"LogUnregister\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":true,\"name\":\"externalAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"flag\",\"type\":\"bool\"},{\"indexed\":false,\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"LogVote\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"LogSetOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"eventType\",\"type\":\"bytes32\"},{\"indexed\":false,\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"LogBaseAccount\",\"type\":\"event\"}]"
    };

    public static final String ABI = String.join("", ABI_ARRAY);

    public static final String FUNC_PASSED = "passed";

    public static final String FUNC_GETREQUESTINFO = "getRequestInfo";

    public static final String FUNC__STATUS = "_status";

    public static final String FUNC_SETOWNER = "setOwner";

    public static final String FUNC_SETWEIGHT = "setWeight";

    public static final String FUNC_SETOWNERBYMANAGER = "setOwnerByManager";

    public static final String FUNC_SETSTATICS = "setStatics";

    public static final String FUNC_FREEZE = "freeze";

    public static final String FUNC_REGISTER = "register";

    public static final String FUNC_UNFREEZE = "unfreeze";

    public static final String FUNC_ISNORMAL = "isNormal";

    public static final String FUNC_UNREGISTER = "unregister";

    public static final String FUNC_GETVOTEWEIGHT = "getVoteWeight";

    public static final String FUNC_GETVOTEPARAS = "getVoteParas";

    public static final String FUNC__ACCOUNTMANAGER = "_accountManager";

    public static final String FUNC__OWNER = "_owner";

    public static final String FUNC__STATICS = "_statics";

    public static final String FUNC_GETWEIGHTINFO = "getWeightInfo";

    public static final String FUNC_VOTE = "vote";

    public static final String FUNC_CANCEL = "cancel";

    public static final String FUNC_SETVOTESTATICS = "setVoteStatics";

    public static final Event LOGREGISTER_EVENT =
            new Event(
                    "LogRegister",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Uint256>(true) {},
                            new TypeReference<Uint8>(true) {},
                            new TypeReference<Address>(true) {},
                            new TypeReference<Address>() {},
                            new TypeReference<Uint16>() {},
                            new TypeReference<Address>() {}));;

    public static final Event LOGUNREGISTER_EVENT =
            new Event(
                    "LogUnregister",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Uint256>(true) {}, new TypeReference<Address>() {}));;

    public static final Event LOGVOTE_EVENT =
            new Event(
                    "LogVote",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Uint256>(true) {},
                            new TypeReference<Address>(true) {},
                            new TypeReference<Bool>() {},
                            new TypeReference<Address>() {}));;

    public static final Event LOGSETOWNER_EVENT =
            new Event(
                    "LogSetOwner",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Address>(true) {},
                            new TypeReference<Address>(true) {}));;

    public static final Event LOGBASEACCOUNT_EVENT =
            new Event(
                    "LogBaseAccount",
                    Arrays.<TypeReference<?>>asList(
                            new TypeReference<Bytes32>(true) {}, new TypeReference<Address>() {}));;

    protected UserAccount(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
    }

    public static String getBinary(CryptoSuite cryptoSuite) {
        return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
    }

    public Boolean passed(BigInteger id) throws ContractException {
        final Function function =
                new Function(
                        FUNC_PASSED,
                        Arrays.<Type>asList(new Uint256(id)),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public Tuple8<
                    BigInteger,
                    String,
                    BigInteger,
                    BigInteger,
                    BigInteger,
                    BigInteger,
                    String,
                    BigInteger>
            getRequestInfo(BigInteger id) throws ContractException {
        final Function function =
                new Function(
                        FUNC_GETREQUESTINFO,
                        Arrays.<Type>asList(new Uint256(id)),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Uint256>() {},
                                new TypeReference<Address>() {},
                                new TypeReference<Uint16>() {},
                                new TypeReference<Uint16>() {},
                                new TypeReference<Uint8>() {},
                                new TypeReference<Uint8>() {},
                                new TypeReference<Address>() {},
                                new TypeReference<Uint16>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple8<
                BigInteger,
                String,
                BigInteger,
                BigInteger,
                BigInteger,
                BigInteger,
                String,
                BigInteger>(
                (BigInteger) results.get(0).getValue(),
                (String) results.get(1).getValue(),
                (BigInteger) results.get(2).getValue(),
                (BigInteger) results.get(3).getValue(),
                (BigInteger) results.get(4).getValue(),
                (BigInteger) results.get(5).getValue(),
                (String) results.get(6).getValue(),
                (BigInteger) results.get(7).getValue());
    }

    public BigInteger _status() throws ContractException {
        final Function function =
                new Function(
                        FUNC__STATUS,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Uint8>() {}));
        return executeCallWithSingleValueReturn(function, BigInteger.class);
    }

    public TransactionReceipt setOwner(String owner) {
        final Function function =
                new Function(
                        FUNC_SETOWNER,
                        Arrays.<Type>asList(new Address(owner)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setOwner(String owner, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_SETOWNER,
                        Arrays.<Type>asList(new Address(owner)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetOwner(String owner) {
        final Function function =
                new Function(
                        FUNC_SETOWNER,
                        Arrays.<Type>asList(new Address(owner)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getSetOwnerInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_SETOWNER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>((String) results.get(0).getValue());
    }

    public TransactionReceipt setWeight(String externalAccount, BigInteger weight) {
        final Function function =
                new Function(
                        FUNC_SETWEIGHT,
                        Arrays.<Type>asList(new Address(externalAccount), new Uint16(weight)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setWeight(String externalAccount, BigInteger weight, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_SETWEIGHT,
                        Arrays.<Type>asList(new Address(externalAccount), new Uint16(weight)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetWeight(String externalAccount, BigInteger weight) {
        final Function function =
                new Function(
                        FUNC_SETWEIGHT,
                        Arrays.<Type>asList(new Address(externalAccount), new Uint16(weight)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<String, BigInteger> getSetWeightInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_SETWEIGHT,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Address>() {}, new TypeReference<Uint16>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<String, BigInteger>(
                (String) results.get(0).getValue(), (BigInteger) results.get(1).getValue());
    }

    public Tuple1<Boolean> getSetWeightOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_SETWEIGHT,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public Boolean passed(
            BigInteger txType, String requestAddress, String newAddress, BigInteger newValue)
            throws ContractException {
        final Function function =
                new Function(
                        FUNC_PASSED,
                        Arrays.<Type>asList(
                                new Uint8(txType),
                                new Address(requestAddress),
                                new Address(newAddress),
                                new Uint16(newValue)),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public TransactionReceipt setOwnerByManager(String owner) {
        final Function function =
                new Function(
                        FUNC_SETOWNERBYMANAGER,
                        Arrays.<Type>asList(new Address(owner)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setOwnerByManager(String owner, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_SETOWNERBYMANAGER,
                        Arrays.<Type>asList(new Address(owner)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetOwnerByManager(String owner) {
        final Function function =
                new Function(
                        FUNC_SETOWNERBYMANAGER,
                        Arrays.<Type>asList(new Address(owner)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getSetOwnerByManagerInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_SETOWNERBYMANAGER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>((String) results.get(0).getValue());
    }

    public Tuple1<Boolean> getSetOwnerByManagerOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_SETOWNERBYMANAGER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt setStatics() {
        final Function function =
                new Function(
                        FUNC_SETSTATICS,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setStatics(TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_SETSTATICS,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetStatics() {
        final Function function =
                new Function(
                        FUNC_SETSTATICS,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<Boolean> getSetStaticsOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_SETSTATICS,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt freeze() {
        final Function function =
                new Function(
                        FUNC_FREEZE,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void freeze(TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_FREEZE,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForFreeze() {
        final Function function =
                new Function(
                        FUNC_FREEZE,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<Boolean> getFreezeOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_FREEZE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt register(
            BigInteger txType, String requestAddress, String newAddress, BigInteger newValue) {
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(
                                new Uint8(txType),
                                new Address(requestAddress),
                                new Address(newAddress),
                                new Uint16(newValue)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void register(
            BigInteger txType,
            String requestAddress,
            String newAddress,
            BigInteger newValue,
            TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(
                                new Uint8(txType),
                                new Address(requestAddress),
                                new Address(newAddress),
                                new Uint16(newValue)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForRegister(
            BigInteger txType, String requestAddress, String newAddress, BigInteger newValue) {
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(
                                new Uint8(txType),
                                new Address(requestAddress),
                                new Address(newAddress),
                                new Uint16(newValue)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple4<BigInteger, String, String, BigInteger> getRegisterUint8AddressAddressUint16Input(
            TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Uint8>() {},
                                new TypeReference<Address>() {},
                                new TypeReference<Address>() {},
                                new TypeReference<Uint16>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple4<BigInteger, String, String, BigInteger>(
                (BigInteger) results.get(0).getValue(),
                (String) results.get(1).getValue(),
                (String) results.get(2).getValue(),
                (BigInteger) results.get(3).getValue());
    }

    public Tuple2<Boolean, BigInteger> getRegisterUint8AddressAddressUint16Output(
            TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Bool>() {}, new TypeReference<Uint256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<Boolean, BigInteger>(
                (Boolean) results.get(0).getValue(), (BigInteger) results.get(1).getValue());
    }

    public TransactionReceipt unfreeze() {
        final Function function =
                new Function(
                        FUNC_UNFREEZE,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void unfreeze(TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_UNFREEZE,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForUnfreeze() {
        final Function function =
                new Function(
                        FUNC_UNFREEZE,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<Boolean> getUnfreezeOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_UNFREEZE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt isNormal() {
        final Function function =
                new Function(
                        FUNC_ISNORMAL,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void isNormal(TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_ISNORMAL,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForIsNormal() {
        final Function function =
                new Function(
                        FUNC_ISNORMAL,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<Boolean> getIsNormalOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_ISNORMAL,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt unregister(BigInteger id) {
        final Function function =
                new Function(
                        FUNC_UNREGISTER,
                        Arrays.<Type>asList(new Uint256(id)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void unregister(BigInteger id, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_UNREGISTER,
                        Arrays.<Type>asList(new Uint256(id)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForUnregister(BigInteger id) {
        final Function function =
                new Function(
                        FUNC_UNREGISTER,
                        Arrays.<Type>asList(new Uint256(id)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<BigInteger> getUnregisterInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_UNREGISTER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Uint256>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<BigInteger>((BigInteger) results.get(0).getValue());
    }

    public Tuple1<Boolean> getUnregisterOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_UNREGISTER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt register(
            BigInteger id,
            BigInteger txType,
            String requestAddress,
            String newAddress,
            BigInteger newValue) {
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(
                                new Uint256(id),
                                new Uint8(txType),
                                new Address(requestAddress),
                                new Address(newAddress),
                                new Uint16(newValue)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void register(
            BigInteger id,
            BigInteger txType,
            String requestAddress,
            String newAddress,
            BigInteger newValue,
            TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(
                                new Uint256(id),
                                new Uint8(txType),
                                new Address(requestAddress),
                                new Address(newAddress),
                                new Uint16(newValue)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForRegister(
            BigInteger id,
            BigInteger txType,
            String requestAddress,
            String newAddress,
            BigInteger newValue) {
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(
                                new Uint256(id),
                                new Uint8(txType),
                                new Address(requestAddress),
                                new Address(newAddress),
                                new Uint16(newValue)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple5<BigInteger, BigInteger, String, String, BigInteger>
            getRegisterUint256Uint8AddressAddressUint16Input(
                    TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Uint256>() {},
                                new TypeReference<Uint8>() {},
                                new TypeReference<Address>() {},
                                new TypeReference<Address>() {},
                                new TypeReference<Uint16>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple5<BigInteger, BigInteger, String, String, BigInteger>(
                (BigInteger) results.get(0).getValue(),
                (BigInteger) results.get(1).getValue(),
                (String) results.get(2).getValue(),
                (String) results.get(3).getValue(),
                (BigInteger) results.get(4).getValue());
    }

    public Tuple1<Boolean> getRegisterUint256Uint8AddressAddressUint16Output(
            TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_REGISTER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public BigInteger getVoteWeight(String externalAccount) throws ContractException {
        final Function function =
                new Function(
                        FUNC_GETVOTEWEIGHT,
                        Arrays.<Type>asList(new Address(externalAccount)),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Uint16>() {}));
        return executeCallWithSingleValueReturn(function, BigInteger.class);
    }

    public Tuple4<BigInteger, String, String, BigInteger> getVoteParas(BigInteger id)
            throws ContractException {
        final Function function =
                new Function(
                        FUNC_GETVOTEPARAS,
                        Arrays.<Type>asList(new Uint256(id)),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Uint8>() {},
                                new TypeReference<Address>() {},
                                new TypeReference<Address>() {},
                                new TypeReference<Uint16>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple4<BigInteger, String, String, BigInteger>(
                (BigInteger) results.get(0).getValue(),
                (String) results.get(1).getValue(),
                (String) results.get(2).getValue(),
                (BigInteger) results.get(3).getValue());
    }

    public String _accountManager() throws ContractException {
        final Function function =
                new Function(
                        FUNC__ACCOUNTMANAGER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public String _owner() throws ContractException {
        final Function function =
                new Function(
                        FUNC__OWNER,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public BigInteger _statics() throws ContractException {
        final Function function =
                new Function(
                        FUNC__STATICS,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Uint8>() {}));
        return executeCallWithSingleValueReturn(function, BigInteger.class);
    }

    public Tuple3<List<String>, List<BigInteger>, BigInteger> getWeightInfo()
            throws ContractException {
        final Function function =
                new Function(
                        FUNC_GETWEIGHTINFO,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<DynamicArray<Address>>() {},
                                new TypeReference<DynamicArray<Uint16>>() {},
                                new TypeReference<Uint16>() {}));
        List<Type> results = executeCallWithMultipleValueReturn(function);
        return new Tuple3<List<String>, List<BigInteger>, BigInteger>(
                convertToNative((List<Address>) results.get(0).getValue()),
                convertToNative((List<Uint16>) results.get(1).getValue()),
                (BigInteger) results.get(2).getValue());
    }

    public TransactionReceipt vote(BigInteger id, Boolean flag) {
        final Function function =
                new Function(
                        FUNC_VOTE,
                        Arrays.<Type>asList(new Uint256(id), new Bool(flag)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void vote(BigInteger id, Boolean flag, TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_VOTE,
                        Arrays.<Type>asList(new Uint256(id), new Bool(flag)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForVote(BigInteger id, Boolean flag) {
        final Function function =
                new Function(
                        FUNC_VOTE,
                        Arrays.<Type>asList(new Uint256(id), new Bool(flag)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<BigInteger, Boolean> getVoteInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_VOTE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<Uint256>() {}, new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<BigInteger, Boolean>(
                (BigInteger) results.get(0).getValue(), (Boolean) results.get(1).getValue());
    }

    public Tuple1<Boolean> getVoteOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_VOTE,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt cancel() {
        final Function function =
                new Function(
                        FUNC_CANCEL,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void cancel(TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_CANCEL,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForCancel() {
        final Function function =
                new Function(
                        FUNC_CANCEL,
                        Arrays.<Type>asList(),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<Boolean> getCancelOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_CANCEL,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public TransactionReceipt setVoteStatics(
            List<String> key, List<BigInteger> value, BigInteger threshold) {
        final Function function =
                new Function(
                        FUNC_SETVOTESTATICS,
                        Arrays.<Type>asList(
                                key.isEmpty()
                                        ? DynamicArray.empty("address[]")
                                        : new DynamicArray<Address>(
                                                org.fisco.bcos.sdk.abi.Utils.typeMap(
                                                        key, Address.class)),
                                value.isEmpty()
                                        ? DynamicArray.empty("uint16[]")
                                        : new DynamicArray<Uint16>(
                                                org.fisco.bcos.sdk.abi.Utils.typeMap(
                                                        value, Uint16.class)),
                                new Uint16(threshold)),
                        Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setVoteStatics(
            List<String> key,
            List<BigInteger> value,
            BigInteger threshold,
            TransactionCallback callback) {
        final Function function =
                new Function(
                        FUNC_SETVOTESTATICS,
                        Arrays.<Type>asList(
                                key.isEmpty()
                                        ? DynamicArray.empty("address[]")
                                        : new DynamicArray<Address>(
                                                org.fisco.bcos.sdk.abi.Utils.typeMap(
                                                        key, Address.class)),
                                value.isEmpty()
                                        ? DynamicArray.empty("uint16[]")
                                        : new DynamicArray<Uint16>(
                                                org.fisco.bcos.sdk.abi.Utils.typeMap(
                                                        value, Uint16.class)),
                                new Uint16(threshold)),
                        Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetVoteStatics(
            List<String> key, List<BigInteger> value, BigInteger threshold) {
        final Function function =
                new Function(
                        FUNC_SETVOTESTATICS,
                        Arrays.<Type>asList(
                                key.isEmpty()
                                        ? DynamicArray.empty("address[]")
                                        : new DynamicArray<Address>(
                                                org.fisco.bcos.sdk.abi.Utils.typeMap(
                                                        key, Address.class)),
                                value.isEmpty()
                                        ? DynamicArray.empty("uint16[]")
                                        : new DynamicArray<Uint16>(
                                                org.fisco.bcos.sdk.abi.Utils.typeMap(
                                                        value, Uint16.class)),
                                new Uint16(threshold)),
                        Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple3<List<String>, List<BigInteger>, BigInteger> getSetVoteStaticsInput(
            TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function =
                new Function(
                        FUNC_SETVOTESTATICS,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(
                                new TypeReference<DynamicArray<Address>>() {},
                                new TypeReference<DynamicArray<Uint16>>() {},
                                new TypeReference<Uint16>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple3<List<String>, List<BigInteger>, BigInteger>(
                convertToNative((List<Address>) results.get(0).getValue()),
                convertToNative((List<Uint16>) results.get(1).getValue()),
                (BigInteger) results.get(2).getValue());
    }

    public Tuple1<Boolean> getSetVoteStaticsOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function =
                new Function(
                        FUNC_SETVOTESTATICS,
                        Arrays.<Type>asList(),
                        Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>((Boolean) results.get(0).getValue());
    }

    public List<LogRegisterEventResponse> getLogRegisterEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGREGISTER_EVENT, transactionReceipt);
        ArrayList<LogRegisterEventResponse> responses =
                new ArrayList<LogRegisterEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogRegisterEventResponse typedResponse = new LogRegisterEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.id = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.txType = (BigInteger) eventValues.getIndexedValues().get(1).getValue();
            typedResponse.requestAddress =
                    (String) eventValues.getIndexedValues().get(2).getValue();
            typedResponse.newAddress = (String) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.newValue =
                    (BigInteger) eventValues.getNonIndexedValues().get(1).getValue();
            typedResponse.contractAddress =
                    (String) eventValues.getNonIndexedValues().get(2).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogRegisterEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGREGISTER_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogRegisterEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGREGISTER_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public List<LogUnregisterEventResponse> getLogUnregisterEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGUNREGISTER_EVENT, transactionReceipt);
        ArrayList<LogUnregisterEventResponse> responses =
                new ArrayList<LogUnregisterEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogUnregisterEventResponse typedResponse = new LogUnregisterEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.id = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.contractAddress =
                    (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogUnregisterEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGUNREGISTER_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogUnregisterEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGUNREGISTER_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public List<LogVoteEventResponse> getLogVoteEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGVOTE_EVENT, transactionReceipt);
        ArrayList<LogVoteEventResponse> responses =
                new ArrayList<LogVoteEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogVoteEventResponse typedResponse = new LogVoteEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.id = (BigInteger) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.externalAccount =
                    (String) eventValues.getIndexedValues().get(1).getValue();
            typedResponse.flag = (Boolean) eventValues.getNonIndexedValues().get(0).getValue();
            typedResponse.contractAddress =
                    (String) eventValues.getNonIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogVoteEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGVOTE_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogVoteEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGVOTE_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public List<LogSetOwnerEventResponse> getLogSetOwnerEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGSETOWNER_EVENT, transactionReceipt);
        ArrayList<LogSetOwnerEventResponse> responses =
                new ArrayList<LogSetOwnerEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogSetOwnerEventResponse typedResponse = new LogSetOwnerEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.owner = (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.contractAddress =
                    (String) eventValues.getIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogSetOwnerEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGSETOWNER_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogSetOwnerEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGSETOWNER_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public List<LogBaseAccountEventResponse> getLogBaseAccountEvents(
            TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList =
                extractEventParametersWithLog(LOGBASEACCOUNT_EVENT, transactionReceipt);
        ArrayList<LogBaseAccountEventResponse> responses =
                new ArrayList<LogBaseAccountEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogBaseAccountEventResponse typedResponse = new LogBaseAccountEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.eventType = (byte[]) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.contractAddress =
                    (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogBaseAccountEvent(
            String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGBASEACCOUNT_EVENT);
        subscribeEvent(ABI, BINARY, topic0, fromBlock, toBlock, otherTopics, callback);
    }

    public void subscribeLogBaseAccountEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGBASEACCOUNT_EVENT);
        subscribeEvent(ABI, BINARY, topic0, callback);
    }

    public static UserAccount load(
            String contractAddress, Client client, CryptoKeyPair credential) {
        return new UserAccount(contractAddress, client, credential);
    }

    public static UserAccount deploy(
            Client client, CryptoKeyPair credential, String accountManager, String owner)
            throws ContractException {
        String encodedConstructor =
                FunctionEncoder.encodeConstructor(
                        Arrays.<Type>asList(new Address(accountManager), new Address(owner)));
        return deploy(
                UserAccount.class,
                client,
                credential,
                getBinary(client.getCryptoSuite()),
                encodedConstructor);
    }

    public static class LogRegisterEventResponse {
        public TransactionReceipt.Logs log;

        public BigInteger id;

        public BigInteger txType;

        public String requestAddress;

        public String newAddress;

        public BigInteger newValue;

        public String contractAddress;
    }

    public static class LogUnregisterEventResponse {
        public TransactionReceipt.Logs log;

        public BigInteger id;

        public String contractAddress;
    }

    public static class LogVoteEventResponse {
        public TransactionReceipt.Logs log;

        public BigInteger id;

        public String externalAccount;

        public Boolean flag;

        public String contractAddress;
    }

    public static class LogSetOwnerEventResponse {
        public TransactionReceipt.Logs log;

        public String owner;

        public String contractAddress;
    }

    public static class LogBaseAccountEventResponse {
        public TransactionReceipt.Logs log;

        public byte[] eventType;

        public String contractAddress;
    }
}
